package com.ys.可变字符串;

import java.sql.Date;

/**
 * 描述: StringBuilder的基本应用
 * <p>
 * 1.StringBuffer类的概述
 * StringBuffer类属于可变字符串，因为其底层的char[]没有使用final修饰，我们就称StringBuffer为可变的Unicode字符序列。
 * StringBuffer继承于AbstractStringBuilder抽象类，在该抽象类中我们发现char[]没有使用final修饰，通俗的来讲可变字符串底层维护着一个可以自动扩容的数组。
 * 2.StringBuffer类构造方法
 * StringBuffer()	                构造一个没有字符的字符串缓冲区，初始容量为16个字符。
 * StringBuffer(CharSequence seq)	构造一个包含与指定的相同字符的字符串缓冲区CharSequence，并且初始容量为seq.length() + 16。
 * StringBuffer(int capacity)	    构造一个没有字符的字符串缓冲区和指定的初始容量，初始容量capacity。
 * StringBuffer(String str)	    构造一个初始化为指定字符串内容的字符串缓冲区，并且初始容量为str.length() + 16。
 * 3.StringBuffer类常见方法
 * 3.1toString()方法
 * public synchronized String toString()
 * 把StringBuffer对象转化为String类型的对象
 * 3.2添加方法
 * public synchronized StringBuffer append(Type d)
 * 把方法的参数追加到可变字符串末尾，并且直接修改的是char[]的数组，也就是直接修改的可变字符串。
 * public AbstractStringBuilder insert(int offset, Type value)
 * 把value插入到可变字符串offset的索引位置中
 * 注意：offset的取值范围：[0, length()]
 * 3.3删除方法
 * public synchronized StringBuffer delete(int start, int end)
 * 删除指定索引范围的内容，也就是删除[start, end - 1]索引范围的字符
 * 注意：start的取值范围[0, length() - 1]，end的取值范围：[0, length() - 1]，并且要求end > start
 * public synchronized StringBuffer deleteCharAt(int index)
 * 删除指定索引位置的字符，index的取值：[0, length() - 1]
 * 3.4查找方法
 * charAt(int index)	                        返回 char在指定索引在这个序列值。
 * indexOf(String str)	                    返回指定子字符串第一次出现的字符串内的索引。
 * *   indexOf(String str, int fromIndex)	    返回指定子串的第一次出现的字符串中的索引，从指定的索引开始。
 * *   lastIndexOf(String str)	                返回指定子字符串最右边出现的字符串内的索引。
 * lastIndexOf(String str, int fromIndex)	返回指定子字符串最后一次出现的字符串中的索引，从指定的索引开始。
 * *3.5修改方法
 * public synchronized StringBuffer replace(int start, int end, String str)
 * 把索引范围为[start, end)内容替换为str字符串。
 * public synchronized void setCharAt(int index, char ch)
 * 把index索引位置的字符替换为ch
 * 3.6reverse方法
 * public synchronized StringBuffer reverse()
 * 实现字符串的反转操作
 * 3.7setLength方法
 * public synchronized void setLength(int newLength)
 * 设置可变字符串的长度，当newLength小于字符串的长度，则执行剪切操作；当newLength大于字符串的长度，则执行扩容操作。
 * 3.8其它常见方法
 * length()	                    返回长度（字符数）。
 * substring(int start)	        返回一个新的 String ，其中包含此字符序列中当前包含的字符的子序列。
 * substring(int start, int end)	返回一个新的 String ，其中包含此序列中当前包含的字符的子序列。
 *
 * @author CodeYang
 * @version 2020/12/22 21:40
 */
public class StringBuilder的基础应用 {


    public static void main(String[] args) {

        Date

    }

    /**
     * StringBuffer 可变字符串追加 与栈帧释放
     */
    static void test_StringBuffer_Stack(){
        StringBuffer a = new StringBuffer("A");
        StringBuffer b = new StringBuffer("B");
        mb_operate(a, b);
        System.out.println(a + "." + b);
    }
    static void mb_operate(StringBuffer x, StringBuffer y) {
        x.append(y);
        y = x;
    }
    /**
     * setLength 应用
     * public void setLength(int newLength)
     * 设置str的长度,会直接扩容:
     * ensureCapacityInternal(newLength);
     *  同时如果 长度设置小于本身会又切割的效果
     */
    private static void f1() {
        StringBuilder str = new StringBuilder("123");

        str.setLength(20);

        System.out.print("aa"+str.length()+"aa");

    }
}
